package sim.utils.rndGen;

/**
 * Clase para generar números aleatorios con distintos métodos usando el patron
 * Strategy. <br>
 * Los métodos posibles son: 
 * <ul>
 * <li>Método de los Medios Cuadrados.
 * <li>Método Congruencial Mixto.
 * <li>Método nativo del lenguaje Java.
 * </ul>
 * 
 * @author alejandro
 * 
 */
public class Random {

	public static final int METODO_MEDIOS_CUADRADOS = 1;
	public static final int METODO_CONGRUENCIAL_MIXTO = 2;
	public static final int METODO_JAVA_NATIVO = 3;

	private RandomGenerator generador;
	private int metodo;

	public Random(int metodo) {
		this.setMetodo(metodo);
	}

	public Random() {
		this.setMetodo(Random.METODO_JAVA_NATIVO);
	}

	public Random(long seed) {
		this.setMetodo(Random.METODO_JAVA_NATIVO, seed);
	}

	public Random(int metodo, long seed) {
		this.setMetodo(metodo, seed);
	}

	public void setMetodo(int metodo, long seed) {
		this.metodo = metodo;

		switch (this.metodo) {
		case Random.METODO_MEDIOS_CUADRADOS:
			this.generador = new RGMediosCuadrados(seed);
			break;

		case Random.METODO_CONGRUENCIAL_MIXTO:
			this.generador = new RGCongruencialMixto(seed);
			break;

		case Random.METODO_JAVA_NATIVO:
			this.generador = new RGNative(seed);
			break;

		default:
			break;
		}
	}

	public void setMetodo(int metodo) {
		this.setMetodo(metodo, RandomGenerator.generateAutoSeed());
	}

	public int getMetodo() {
		return metodo;
	}

	public double next() {
		return this.generador.next();
	}

}
